package com.example.mediacore.player;

/**
 * 媒体信息封装类，包含音视频流的基础属性
 * 非当前流类型的字段将返回默认值（-1 或空字符串）
 */
public class MediaInfo {
    // 媒体流类型枚举
    public static final int STREAM_TYPE_AUDIO = 0;   // 音频流
    public static final int STREAM_TYPE_VIDEO = 1;   // 视频流
    public static final int STREAM_AUDIO_VIDEO = 2;  // 视音频

    // 基础信息（所有流通用）
    private final long startPtsUs;        // 起始时间戳（微秒）
    private final long durationUs;        // 总时长（微秒）
    private final long bitRate;           // 比特率（bps）

    // 音频专属信息（非音频流时为默认值）
    private final boolean hasAudio;       // 是否有音频
    private final int audioStreamIdx;     // 音频流索引
    private final int sampleRate;         // 采样率（Hz）
    private final int audioChannels;      // 声道数
    private final String sampleFormat;    // 采样格式（如 "s16"、"fltp"）

    // 视频专属信息（非视频流时为默认值）
    private final boolean hasVideo;       // 是否有视频
    private final int videoStreamIdx;     // 视频流索引
    private final int width;              // 视频宽度（像素）
    private final int height;             // 视频高度（像素）
    private final String pixelFormat;     // 像素格式（如 "yuv420p"、"rgba"）
    private final float frameRate;        // 帧率（fps）

    /**
     * 全参构造函数（由 JNI 层调用，上层无需直接使用）
     *
     * @param startPtsUs       起始时间戳（微秒）
     * @param durationUs       总时长（微秒）
     * @param bitRate          比特率（bps）
     * @param hasAudio         是否有音频
     * @param audioStreamIdx   音频流索引
     * @param sampleRate       音频采样率（Hz）
     * @param audioChannels    音频声道数
     * @param sampleFormat     音频采样格式
     * @param hasVideo         是否有视频
     * @param videoStreamIdx   视频流索引
     * @param width            视频宽度
     * @param height           视频高度
     * @param pixelFormat      视频像素格式
     * @param frameRate        视频帧率（fps）
     */
    public MediaInfo(long startPtsUs,
                     long durationUs,
                     long bitRate,
                     boolean hasAudio,
                     int audioStreamIdx,
                     int sampleRate,
                     int audioChannels,
                     String sampleFormat,
                     boolean hasVideo,
                     int videoStreamIdx,
                     int width,
                     int height,
                     String pixelFormat,
                     float frameRate) {
        this.startPtsUs = startPtsUs;
        this.durationUs = durationUs;
        this.bitRate = bitRate;
        this.hasAudio = hasAudio;
        this.audioStreamIdx = audioStreamIdx;
        this.sampleRate = sampleRate;
        this.audioChannels = audioChannels;
        this.sampleFormat = sampleFormat;
        this.hasVideo = hasVideo;
        this.videoStreamIdx = videoStreamIdx;
        this.width = width;
        this.height = height;
        this.pixelFormat = pixelFormat;
        this.frameRate = frameRate;
    }


    /**
     * 判断是否为音频流
     */
    public boolean isAudioStream() {
        return hasAudio;
    }

    /**
     * 判断是否为视频流
     */
    public boolean isVideoStream() {
        return hasVideo;
    }

    /**
     * 获取起始时间戳（微秒）
     */
    public long getStartPtsUs() {
        return startPtsUs;
    }

    /**
     * 获取起始时间戳（毫秒）
     */
    public long getStartPtsMs() {
        return startPtsUs / 1000;
    }

    /**
     * 获取总时长（微秒）
     */
    public long getDurationUs() {
        return durationUs;
    }

    /**
     * 获取总时长（毫秒）
     */
    public long getDurationMs() {
        return durationUs / 1000;
    }

    /**
     * 获取总时长（秒）
     */
    public int getDurationSec() {
        return (int) (durationUs / 1000_000);
    }

    /**
     * 获取比特率（bps）
     */
    public long getBitRate() {
        return bitRate;
    }

    /**
     * 获取比特率（kbps，保留1位小数）
     */
    public float getBitRateKbps() {
        return bitRate <= 0 ? 0 : (float) bitRate / 1024;
    }

    // ====================== 音频信息 Getter ======================

    /**
     * 获取音频流索引（非音频流返回 -1）
     */
    public int getAudioStreamIdx() {
        return audioStreamIdx;
    }

    /**
     * 获取音频采样率（Hz，非音频流返回 -1）
     */
    public int getSampleRate() {
        return sampleRate;
    }

    /**
     * 获取音频声道数（非音频流返回 -1）
     */
    public int getAudioChannels() {
        return audioChannels;
    }

    /**
     * 获取音频采样格式（如 "s16"，非音频流返回空字符串）
     */
    public String getSampleFormat() {
        return sampleFormat;
    }

    // ====================== 视频信息 Getter ======================

    /**
     * 获取视频流索引（非视频流返回 -1）
     */
    public int getVideoStreamIdx() {
        return videoStreamIdx;
    }

    /**
     * 获取视频宽度（像素，非视频流返回 -1）
     */
    public int getWidth() {
        return width;
    }

    /**
     * 获取视频高度（像素，非视频流返回 -1）
     */
    public int getHeight() {
        return height;
    }

    /**
     * 获取视频分辨率（如 "1920x1080"，非视频流返回空字符串）
     */
    public String getResolution() {
        if (isVideoStream() && width > 0 && height > 0) {
            return width + "x" + height;
        }
        return "";
    }

    /**
     * 获取视频像素格式（如 "yuv420p"，非视频流返回空字符串）
     */
    public String getPixelFormat() {
        return pixelFormat;
    }

    /**
     * 获取视频帧率（fps，非视频流返回 0）
     */
    public float getFrameRate() {
        return frameRate;
    }

    /**
     * 格式化输出媒体信息（调试用）
     */
    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append("MediaInfo{")
                .append(", 时长=").append(getDurationSec()).append("秒")
                .append(", 比特率=").append(String.format("%.1f", getBitRateKbps())).append("kbps");

        if (isAudioStream()) {
            sb.append(", 音频=[")
                    .append("索引=").append(audioStreamIdx)
                    .append(", 采样率=").append(sampleRate).append("Hz")
                    .append(", 声道数=").append(audioChannels)
                    .append(", 格式=").append(sampleFormat)
                    .append("]");
        } else if (isVideoStream()) {
            sb.append(", 视频=[")
                    .append("索引=").append(videoStreamIdx)
                    .append(", 分辨率=").append(getResolution())
                    .append(", 帧率=").append(frameRate).append("fps")
                    .append(", 格式=").append(pixelFormat)
                    .append("]");
        }

        sb.append("}");
        return sb.toString();
    }
}